package com.wzxl.utils.concurrent;

import com.google.common.util.concurrent.RateLimiter;
import com.wzxl.utils.concurrent.jsr166e.LongAdder;
import com.wzxl.utils.concurrent.throttle.Sampler;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

public class ConcurrentTools {

    /**
     * 返回没有激烈CAS冲突的LongAdder, 并发的＋1将在不同的Counter里进行，只在取值时将多个Counter求和.
     * <p>
     * 为了保持JDK版本兼容性，统一采用移植版
     */
    public static LongAdder longAdder() {
        return new LongAdder();
    }

    /**
     * 返回CountDownLatch
     */
    public static CountDownLatch countDownLatch(int count) {
        return new CountDownLatch(count);
    }

    /**
     * 返回CyclicBarrier
     */
    public static CyclicBarrier cyclicBarrier(int count) {
        return new CyclicBarrier(count);
    }

    /////////// 限流采样 //////

    /**
     * 返回漏桶算法的RateLimiter
     *
     * @permitsPerSecond 期望的QPS, RateLimiter将QPS平滑到毫秒级别上，但有蓄水及桶外预借的能力.
     */
    public static RateLimiter rateLimiter(int permitsPerSecond) {
        return RateLimiter.create(permitsPerSecond);
    }

    /**
     * 返回采样器.
     *
     * @param selectPercent 采样率，在0-100 之间，可以有小数位
     */
    public static Sampler sampler(double selectPercent) {
        return Sampler.create(selectPercent);
    }
}
